package com.dream.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 匠人码农
 * @date 2020/11/04 16:18
 * 概要：
 *     通过本类学习HttpServletRequest类相关API操作
 *     1.下面api方法
 *       1.1  getRequestURI()         获取请求的资源路径
 *       1.2  getRequestURL()         获取请求的统一资源定位符（绝对路径）
 *       1.3  getRemoteHost()         获取客户端的ip地址
 *       1.4  getHeader()             获取请求头
 *       1.5  getParameter(key)       获取请求参数
 *       1.6  getParameterValues()    获取请求参数的值
 *       1.7  getMethod()             获取请求方法
 *       1.8  setAttribute(key,value) 设置域数据
 *       1.9  getAttribute(key)       获取域数据
 *       1.10 getRequestDispatcher()  获取请求转发对象
 *     2.获取post请求中文乱码的问题
 *       解决方案
 *          在获取请求参数（getParameter()）之前执行req.setCharacterEncoding("UTF-8")
 *     3.关于get请求中乱码的问题
 *        上面post中的解决方案对get请求无效。
 *        因为tomcat服务器默认对get请求用iso-8859-1编码。
 *        那么对于get请求乱码问题如何解决？
 *        有以下3中解决防方案。
 *        1> 把get请求改成Post请求。
 *        2> 对通过getParameter("")获取的参数值通过创建指定编码类型(UTF-8,GBK)的字符串的方式解决。
 *           即 new String(req.getParameter(""),"UTF-8")
 *        3> 设置tomcat服务器的配置文件。
 *           conf/server.xml的Connector标签中追加：URIEncoding="UTF-8"
 */

public class RequestAPIServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
           此时下面的设置无效。
         */
//        //解决值为中文的时候，获取乱码问题
//        req.setCharacterEncoding("UTF-8");
//        //获取编码格式
//        System.out.println("get请求方式编码方式：" + req.getCharacterEncoding());

        //获取请求的资源路径
        System.out.println("请求资源路径（URI）：" + req.getRequestURI());

        //获取请求的同一资源定位符
        System.out.println("请求资源同一资源定位符（URL）：" + req.getRequestURL());

        //获取客户端的ip地址
        System.out.println("客户端的ip地址：" + req.getRemoteHost());

        //获取请求头
        System.out.println("请求头信息:" + req.getHeader("Host"));

        //获取请求参数
        //浏览器的地址栏中输入：http://localhost:8080/JavaWebServlet/requestapi?user=123456
        System.out.println("请求参数user：" + new String(req.getParameter("user").getBytes("ISO-8859-1"),"UTF-8"));
//        System.out.println("请求参数user：" + req.getParameter("user"));
        //获取请求参数的值
        //获取的值为一个String类型的数组
        String[] array = req.getParameterValues("hoby");
        for(int i = 0;i < array.length;i++) {
            System.out.println("请求参数的值" + i + ":" +  array[i]);
        }

        //获取请求方法
        System.out.println("请求方法：" + req.getMethod());

        //设置域数据
        req.setAttribute("key1","value1");

        //获取域数据
        System.out.println("域数据key1：" + req.getAttribute("key1"));

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //解决值为中文的时候，获取乱码问题
        //注意一定要在getParameter(""）之前执行。
        req.setCharacterEncoding("UTF-8");

        //获取请求的资源路径
        System.out.println("请求资源路径（URI）：" + req.getRequestURI());

        //获取请求的同一资源定位符
        System.out.println("请求资源同一资源定位符（URL）：" + req.getRequestURL());

        //获取客户端的ip地址
        System.out.println("客户端的ip地址：" + req.getRemoteHost());

        //获取请求头
        System.out.println("请求头信息:" + req.getHeader("Host"));

        //获取请求参数
        System.out.println("请求参数user：" + req.getParameter("user"));

        //获取请求参数的值
        //获取的值为一个String类型的数组
        //比如复选框的时候。复选框可以选择多个值。
        String [] array =req.getParameterValues("hoby");
        for(int i = 0;i < array.length;i++) {
            System.out.println("请求参数的值" + i + ":" +  array[i]);
        }

        //获取请求方法
        System.out.println("请求方法：" + req.getMethod());

        //设置域数据
        req.setAttribute("key1","value1");

        //获取域数据
        System.out.println("域数据key1：" + req.getAttribute("key1"));
    }
}
